{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "d0fa46a8",
   "metadata": {},
   "source": [
    "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/pinecone-io/examples/blob/master/learn/search/image/image-retrieval-ebook/cnn/cifar10.ipynb) [![Open nbviewer](https://raw.githubusercontent.com/pinecone-io/examples/master/assets/nbviewer-shield.svg)](https://nbviewer.org/github/pinecone-io/examples/blob/master/learn/search/image/image-retrieval-ebook/cnn/cifar10.ipynb)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b325e409-0b8c-4b80-a936-32b2b7002d68",
   "metadata": {},
   "source": [
    "### Generate Image Embeddings Using CNNs"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "001eb1ad-7172-4308-a87b-fd9c2ddb29aa",
   "metadata": {},
   "source": [
    "We can better understand the CNNs by looking at some examples. In this section, we will use PyTorch to build from scratch a convolutional neural network that generates image embeddings."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2271958e-cf71-4df8-a3b8-a736dd9c98f7",
   "metadata": {},
   "source": [
    "#### Data Initialization"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0b5121d0-9e68-4c12-98c5-3132bac48b24",
   "metadata": {},
   "source": [
    "Before starting, below are some libraries we would need to build the convolutional network."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "747eefd9-2d8d-4b1e-8f04-6e1f62b603e7",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load in relevant libraries, and alias where appropriate\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torchvision\n",
    "import torchvision.transforms as transforms"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5685d59c-987a-4c9d-af1b-8a9be1ca505b",
   "metadata": {},
   "source": [
    "Given we will be working with a reasonable amount of data, we might want to process it on GPU rather than CPU. To do that, we need to transfer the data from CPU to GPU using ```torch.device```."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "50974897-8297-49ed-a3a4-ae09d704313f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Device will determine whether to run the training on GPU or CPU.\n",
    "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3b4d1a1a-c55f-40ce-a4df-6ee38875b45d",
   "metadata": {},
   "source": [
    "The first step in building our network is downloading and initializing the dataset. \n",
    "\n",
    "The dataset we are downloading is *CIFAR-10* from HuggingFace.\n",
    "\n",
    "We will first download the training dataset by setting ```split = 'train'```, and the testing dataset after by setting ''split = 'test'```. While the training dataset includes 50,000 images divided into 10 classes, the test dataset includes 10,000 images divided into 10 classes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "87510a3c-9382-4a39-a39b-ded727bf6f1d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "66fd6affad2b4c65af7c5263366e0db8",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading builder script:   0%|          | 0.00/1.55k [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "5c583f823627475988ed36885d1398a8",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading metadata:   0%|          | 0.00/799 [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downloading and preparing dataset cifar10/plain_text (download: 162.60 MiB, generated: 130.30 MiB, post-processed: Unknown size, total: 292.90 MiB) to /Users/jamesbriggs/.cache/huggingface/datasets/cifar10/plain_text/1.0.0/447d6ec4733dddd1ce3bb577c7166b986eaa4c538dcd9e805ba61f35674a9de4...\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "8ec7da577bfa4286b6de0f288653cbc5",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading data:   0%|          | 0.00/170M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "84f86317750846738f4b58910a926d2e",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Generating train split:   0%|          | 0/50000 [00:00<?, ? examples/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "7abfa23afc1a49079ec6c6c82de0d0a5",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Generating test split:   0%|          | 0/10000 [00:00<?, ? examples/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dataset cifar10 downloaded and prepared to /Users/jamesbriggs/.cache/huggingface/datasets/cifar10/plain_text/1.0.0/447d6ec4733dddd1ce3bb577c7166b986eaa4c538dcd9e805ba61f35674a9de4. Subsequent calls will reuse this data.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Dataset({\n",
       "    features: ['img', 'label'],\n",
       "    num_rows: 50000\n",
       "})"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# import CIFAR-10 dataset from HuggingFace\n",
    "from datasets import load_dataset\n",
    "\n",
    "dataset_train = load_dataset(\n",
    "    'cifar10',\n",
    "    split='train', # training dataset\n",
    "    ignore_verifications=True  # set to True if seeing splits Error\n",
    ")\n",
    "\n",
    "dataset_train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "8df80571-3e94-492c-8750-898464f7092c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# check how many labels/number of classes\n",
    "num_classes = len(set(dataset_train['label']))\n",
    "num_classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "a5cc6158-181b-4790-92b2-073670bfc975",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<PIL.PngImagePlugin.PngImageFile image mode=RGB size=32x32 at 0x1084E2BB0>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# let's view the image (it's very small)\n",
    "dataset_train[0]['img']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "ba410153-e667-4e75-953e-fa3969568139",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PIL.PngImagePlugin.PngImageFile"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(dataset_train[0]['img'])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9ffafa0e-7189-420f-9a9a-01fe33ed195a",
   "metadata": {},
   "source": [
    "Now pull in the test set (that we will use as a validation set)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "c419b9b4-13a1-4a21-8dfd-7d083f893220",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Reusing dataset cifar10 (/Users/jamesbriggs/.cache/huggingface/datasets/cifar10/plain_text/1.0.0/447d6ec4733dddd1ce3bb577c7166b986eaa4c538dcd9e805ba61f35674a9de4)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Dataset({\n",
       "    features: ['img', 'label'],\n",
       "    num_rows: 10000\n",
       "})"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset_val = load_dataset(\n",
    "    'cifar10',\n",
    "    split='test', # test dataset\n",
    "    ignore_verifications=True  # set to True if seeing splits Error\n",
    ")\n",
    "\n",
    "dataset_val"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "40ad0341-9989-4ddc-88a7-4ee31d9136d3",
   "metadata": {},
   "source": [
    "Most convolutional neural networks are designed so that they can only accept images of a fixed size. It's common practice to overcome this by reshaping the input images. \n",
    "\n",
    "We chose to reshape the image to 32 pixels - see ```img_size```. \n",
    "\n",
    "In addition, PyTorch uses tensors. \n",
    "\n",
    "Therefore, we will transform the data using the ```transforms.Compose``` method, and save the reshaped tensors in the ```preprocess``` variable."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "a4d7c395-5424-4296-9b9b-f78ee9d08695",
   "metadata": {},
   "outputs": [],
   "source": [
    "# image size\n",
    "img_size = 32\n",
    "\n",
    "# preprocess variable, to be used ahead\n",
    "preprocess = transforms.Compose([\n",
    "    transforms.Resize((img_size,img_size)),\n",
    "    transforms.ToTensor()\n",
    "])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "df4d64ee-c5e5-4dfe-829c-35b0080c1ea0",
   "metadata": {},
   "source": [
    "We can now use the ```preprocess``` variable on the dataset with the following loop. However, when we build a cnn, we should ensure every image has the same number of input channels (or depth). This is because the input dimension to the cnn cannot change. \n",
    "\n",
    "If we have RGB images, the depth will be $3$, with one channel for each color (red, green, and blue). If we have grayscale images, the depth will be $1$. \n",
    "\n",
    "In case the dataset contains images with different number of channels, we should convert them from grayscale to RGB (or the other way round). When an image is in grayscale, its ```mode``` is `L`. Otherwise, the mode is `RGB`. \n",
    "\n",
    "We then converted the images to RGB and preprocessed them in the same loop. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "5d55444c-60ec-4913-9771-93db4824b91d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "12651b5e349748539b2c152c38a4ac15",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/50000 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from tqdm.auto import tqdm\n",
    "\n",
    "inputs_train = []\n",
    "\n",
    "for record in tqdm(dataset_train):\n",
    "    image = record['img']\n",
    "    label = record['label']\n",
    "\n",
    "    # convert from grayscale to RGB\n",
    "    if image.mode == 'L':\n",
    "        image = image.convert(\"RGB\")\n",
    "        \n",
    "    # prepocessing\n",
    "    input_tensor = preprocess(image)\n",
    "    \n",
    "    # append to batch list\n",
    "    inputs_train.append([input_tensor, label]) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "3eaf6075",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "50000 torch.Size([3, 32, 32])\n"
     ]
    }
   ],
   "source": [
    "print(len(inputs_train), inputs_train[0][0].shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "34234565-ff48-4333-8070-2786f0a6873d",
   "metadata": {},
   "source": [
    "Below we can see the result from the transformation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "69c256c0-8607-4d30-81ee-c7589e181eba",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[tensor([[[0.6980, 0.6980, 0.6980,  ..., 0.6667, 0.6588, 0.6471],\n",
       "          [0.7059, 0.7020, 0.7059,  ..., 0.6784, 0.6706, 0.6588],\n",
       "          [0.6941, 0.6941, 0.6980,  ..., 0.6706, 0.6627, 0.6549],\n",
       "          ...,\n",
       "          [0.4392, 0.4431, 0.4471,  ..., 0.3922, 0.3843, 0.3961],\n",
       "          [0.4392, 0.4392, 0.4431,  ..., 0.4000, 0.4000, 0.4000],\n",
       "          [0.4039, 0.3922, 0.4039,  ..., 0.3608, 0.3647, 0.3569]],\n",
       " \n",
       "         [[0.6902, 0.6902, 0.6902,  ..., 0.6588, 0.6510, 0.6392],\n",
       "          [0.6980, 0.6941, 0.6980,  ..., 0.6706, 0.6627, 0.6510],\n",
       "          [0.6863, 0.6863, 0.6902,  ..., 0.6627, 0.6549, 0.6471],\n",
       "          ...,\n",
       "          [0.4196, 0.4275, 0.4314,  ..., 0.3804, 0.3686, 0.3725],\n",
       "          [0.4000, 0.4039, 0.4039,  ..., 0.3725, 0.3647, 0.3608],\n",
       "          [0.3765, 0.3647, 0.3725,  ..., 0.3294, 0.3373, 0.3294]],\n",
       " \n",
       "         [[0.7412, 0.7412, 0.7412,  ..., 0.7059, 0.6941, 0.6824],\n",
       "          [0.7490, 0.7451, 0.7490,  ..., 0.7137, 0.7059, 0.6941],\n",
       "          [0.7373, 0.7373, 0.7412,  ..., 0.7059, 0.6980, 0.6902],\n",
       "          ...,\n",
       "          [0.4196, 0.4235, 0.4314,  ..., 0.3686, 0.3647, 0.3725],\n",
       "          [0.3961, 0.4000, 0.4039,  ..., 0.3647, 0.3569, 0.3569],\n",
       "          [0.3608, 0.3529, 0.3686,  ..., 0.3137, 0.3137, 0.3020]]]),\n",
       " 0]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "inputs_train[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f4daa892-7cad-4548-9cee-babf173ae32d",
   "metadata": {},
   "source": [
    "The tensors are normalized to a \\[0, 1\\] range by the `preprocess` pipeline thanks to the `transforms.ToTensor()` function. We need to modify this normalization slightly to fit this specific dataset. To do this, we need the mean and standard deviation values for each of the RGB channels across all images.\n",
    "\n",
    "We calculate that like so:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "1a0a938f-49aa-4daf-a018-e33ae705308e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(512,)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "np.random.seed(0)\n",
    "\n",
    "# calculate mean and std of images, first start by choosing a random sample of tensors\n",
    "idx = np.random.randint(0, len(inputs_train), 512)\n",
    "idx.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "7346e4a6-1dce-4e25-9f1c-b50841506947",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([3, 16384, 32])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# then we concatenate this subset of image tensors\n",
    "tensors = torch.concat([inputs_train[i][0] for i in idx], axis=1)\n",
    "tensors.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "a0ac48ca-28d6-406b-bdcc-e90ec3cfa068",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([524288, 3])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# merge all values into single 3-channel vector\n",
    "tensors = tensors.swapaxes(0, 1).reshape(3, -1).T\n",
    "tensors.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "19c3a7f7-a4a5-4170-9809-118bbf0de5ad",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([0.4670, 0.4735, 0.4662])"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mean = torch.mean(tensors, axis=0)\n",
    "mean"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "4a1552eb-38ca-4022-95e7-48290efaa8e4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([0.2496, 0.2489, 0.2521])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "std = torch.std(tensors, axis=0)\n",
    "std"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "5eb0368f-23c4-4f36-a6a2-14438fdec124",
   "metadata": {},
   "outputs": [],
   "source": [
    "del tensors"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9f6d4ae1-69a6-4f98-b457-f2c43093bb38",
   "metadata": {},
   "source": [
    "Now we use the `mean` $[0.4670, 0.4735, 0.4662]$ and `std` $[0.2496, 0.2489, 0.2521]$ to normalize via another preprocessing step."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "81cfbe6a-05fc-40c3-9136-dcecc7c36840",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 50000/50000 [00:02<00:00, 21317.39it/s]\n"
     ]
    }
   ],
   "source": [
    "preprocess = transforms.Compose([transforms.Normalize(mean=mean, std=std)])\n",
    "\n",
    "for i in tqdm(range(len(inputs_train))):\n",
    "    # prepocessing\n",
    "    input_tensor = preprocess(inputs_train[i][0])\n",
    "    inputs_train[i][0] = input_tensor  # replace with normalized tensor"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e1c55406-6f60-427e-b9dc-1f040d49c286",
   "metadata": {},
   "source": [
    "We can merge the preprocessing steps as follows,"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "88dd5eb8-33cb-48b6-9021-b979ec6ac102",
   "metadata": {},
   "outputs": [],
   "source": [
    "# merge the two preprocessing steps from before\n",
    "preprocess = transforms.Compose([\n",
    "    transforms.Resize((img_size,img_size)),\n",
    "    transforms.ToTensor(),\n",
    "    transforms.Normalize(mean=mean, std=std)\n",
    "])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0692ef00-7f2a-4917-9c90-21cc09bc8588",
   "metadata": {},
   "source": [
    "and we can apply the same transformation to the validation set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "931fa393-df08-4d54-95d6-0e2b4047d29c",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 10000/10000 [00:05<00:00, 1837.85it/s]\n"
     ]
    }
   ],
   "source": [
    "from tqdm.auto import tqdm\n",
    "\n",
    "inputs_val = []\n",
    "i = 0\n",
    "for record in tqdm(dataset_val):\n",
    "    image = record['img']\n",
    "    label = record['label']\n",
    "\n",
    "    # convert from grayscale to RBG\n",
    "    if image.mode == 'L':\n",
    "        image = image.convert(\"RGB\")\n",
    "        \n",
    "    # prepocessing\n",
    "    input_tensor = preprocess(image)\n",
    "    inputs_val.append((input_tensor, label)) # append to batch list"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "28b242ba-7621-4eae-a16c-b0d52a1e8418",
   "metadata": {},
   "source": [
    "Given the amount of data, we would improve the efficiency of our model by running it in batches. We can set the batch size to $64$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "1391456a-1ba6-42ab-9782-d1758e1fc849",
   "metadata": {},
   "outputs": [],
   "source": [
    "# define batch size\n",
    "batch_size = 64"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b054f679-71f8-439c-9d29-6c63ae876d94",
   "metadata": {},
   "source": [
    "We can then use ```DataLoader``` to split both the training and validation dataset into shuffled batches. Shuffle helps prevent model overfitting by ensuring that batches are more representative of the entire dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "a1a68ebd-6fe9-4e00-8471-4ff5174277ff",
   "metadata": {},
   "outputs": [],
   "source": [
    "dloader_train = torch.utils.data.DataLoader(\n",
    "    inputs_train, batch_size=batch_size, shuffle=True\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "8d4f6f12-de4c-4f2b-948b-e64466dbcb2b",
   "metadata": {},
   "outputs": [],
   "source": [
    "dloader_val = torch.utils.data.DataLoader(\n",
    "    inputs_val, batch_size=batch_size, shuffle=False\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4a694096-4a99-49a5-9fae-76c826282ee6",
   "metadata": {},
   "source": [
    "#### Building the CNN's Structure/Architecture "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "09ef12b6-9cf6-4345-814b-05f231e2b5a6",
   "metadata": {},
   "source": [
    "We can now start building our cnn by generating the `ConvNeuralNet` class and the `forward` function. The `ConvNeuralNet` class defines the elements inside our network. The `forward` function establishes their order:\n",
    "\n",
    "- The first two blocks of layers are composed of a convolutional layer followed by a max-pooling layer. After each convolutional layer, we added non-linearity using the ReLU activation function.\n",
    "\n",
    "- The following two blocks of layers are composed of a convolutional layer followed by the ReLU activation function. \n",
    "\n",
    "- We then have another block composed of one convolutional layer, followed by the ReLU, followed by the max pooling layer.\n",
    "\n",
    "At each block, the images are downsampled by the max-pooling layer. Contrary, the number of channels from one layer to another increased from $3$ to $64$, to $192$, ..., to $256$. As we learned before, deeper layers have larger receptive fields and generally detect more specific and complex features, such as ears, eyes, or even human faces and dogs. The chosen filter (or kernel) size is either $3$ or $4$. This is a common choice - having a smaller filter allows the network to better generalize. Padding is $1$ pixel on each layer.\n",
    "\n",
    "- In the end, we have three fully-connected layers. The first two are activated using the ReLU, and the last one uses the Softmax.\n",
    "\n",
    "Note that we added `dropout`. It randomly zeroes (or \"drops out\") some of the elements of the input tensor with a probability $p = 25\\%$. This has proven to be an effective technique for regularization and preventing the co-adaptation of neurons as described in the paper Improving neural networks by preventing co-adaptation of feature detectors [1].\n",
    "\n",
    "\n",
    "We can represent our network as follows:\n",
    "\n",
    "[image]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "d41b3a3d-34fc-42f2-8fd1-fd1c4cd09b22",
   "metadata": {},
   "outputs": [],
   "source": [
    "# creating a CNN class\n",
    "class ConvNeuralNet(nn.Module):\n",
    "\t#  determine what layers and their order in CNN object \n",
    "    def __init__(self, num_classes):\n",
    "        super(ConvNeuralNet, self).__init__()\n",
    "        self.conv_layer1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=4, padding=1)\n",
    "        self.relu1 = nn.ReLU()\n",
    "        self.max_pool1 = nn.MaxPool2d(kernel_size=3, stride=2)\n",
    "\n",
    "        self.conv_layer2 = nn.Conv2d(in_channels=64, out_channels=192, kernel_size=4, padding=1)\n",
    "        self.relu2 = nn.ReLU()\n",
    "        self.max_pool2 = nn.MaxPool2d(kernel_size=3, stride=2)\n",
    "\n",
    "        self.conv_layer3 = nn.Conv2d(in_channels=192, out_channels=384, kernel_size=3, padding=1)\n",
    "        self.relu3 = nn.ReLU()\n",
    "        \n",
    "        self.conv_layer4 = nn.Conv2d(in_channels=384, out_channels=256, kernel_size=3, padding=1)\n",
    "        self.relu4 = nn.ReLU()\n",
    "\n",
    "        self.conv_layer5 = nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, padding=1)\n",
    "        self.relu5 = nn.ReLU()\n",
    "        self.max_pool5 = nn.MaxPool2d(kernel_size=3, stride=2)\n",
    "        \n",
    "        self.dropout6 = nn.Dropout(p=0.5)\n",
    "        self.fc6 = nn.Linear(1024, 512)\n",
    "        self.relu6 = nn.ReLU()\n",
    "        self.dropout7 = nn.Dropout(p=0.5)\n",
    "        self.fc7 = nn.Linear(512, 256)\n",
    "        self.relu7 = nn.ReLU()\n",
    "        self.fc8 = nn.Linear(256, num_classes)\n",
    "    \n",
    "    # progresses data across layers    \n",
    "    def forward(self, x):\n",
    "        out = self.conv_layer1(x)\n",
    "        out = self.relu1(out)\n",
    "        out = self.max_pool1(out)\n",
    "        \n",
    "        out = self.conv_layer2(out)\n",
    "        out = self.relu2(out)\n",
    "        out = self.max_pool2(out)\n",
    "\n",
    "        out = self.conv_layer3(out)\n",
    "        out = self.relu3(out)\n",
    "\n",
    "        out = self.conv_layer4(out)\n",
    "        out = self.relu4(out)\n",
    "\n",
    "        out = self.conv_layer5(out)\n",
    "        out = self.relu5(out)\n",
    "        out = self.max_pool5(out)\n",
    "        \n",
    "        out = out.reshape(out.size(0), -1)\n",
    "        \n",
    "        out = self.dropout6(out)\n",
    "        out = self.fc6(out)\n",
    "        out = self.relu6(out)\n",
    "\n",
    "        out = self.dropout7(out)\n",
    "        out = self.fc7(out)\n",
    "        out = self.relu7(out)\n",
    "\n",
    "        out = self.fc8(out)  # final logits\n",
    "        return out"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "202dbd79-0a54-4a06-84c3-036b9b4b7550",
   "metadata": {},
   "source": [
    "After setting the architecture of our network, we can define the loss function, which is calculated after the forward propagation. We will then define the optimization methodology to run the backpropagation. \n",
    "\n",
    "The loss function used is cross-entropy. \n",
    "\n",
    "The model optimization is run using the stochastic gradient descent (SGD) method with a learning rate equal to $0.008$. Training under SGD, the network is forced to learn to extract features from the image that minimize the loss for extracting features that are the most useful for classifying or recognising images.\n",
    "The learning rate can be chosen randomly by running the model using different values and selecting the one that gives the best performance."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "f37c0a86-e5bb-466c-b7d4-714d731dcaa3",
   "metadata": {},
   "outputs": [],
   "source": [
    "# set the model to device\n",
    "model = ConvNeuralNet(num_classes).to(device)\n",
    "\n",
    "# set Loss function with criterion\n",
    "loss_func = nn.CrossEntropyLoss()\n",
    "\n",
    "# set learning rate \n",
    "lr = 0.008  # 0.0001\n",
    "\n",
    "# set optimizer with optimizer\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=lr) \n",
    "#total_step = len(dloader)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4ffd8888-9195-4463-aa83-aa93ed4a585d",
   "metadata": {},
   "source": [
    "We are now ready to train our model with the forward and the backward propagation in batches. We are now using the `device` variable created above to move the data to GPU, if possible.\n",
    "\n",
    "We have set the times the learning algorithm will work through the entire training dataset (epochs) to 50. As per the learning rate, there is no rule for choosing this value. You can run the model many times with different values and choose the one with the sufficiently minimized error.\n",
    "\n",
    "It is also essential to not choose a number of `epochs` (or `lr`) that causes the model to overfit the training set. To check this, we include a pass through the validation set after each epoch, calculating the val-loss and val-accuracy. If we see the validation set performance degrades while train loss decreases, the model is likely overfitting."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "3027a649-cd51-4c79-a672-2d6d372c1873",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch [1/50], Loss: 2.2982, Val-loss: 2.3003, Val-acc: 11.9%\n",
      "Epoch [2/50], Loss: 2.2820, Val-loss: 2.2750, Val-acc: 15.9%\n",
      "Epoch [3/50], Loss: 1.8341, Val-loss: 2.0457, Val-acc: 19.6%\n",
      "Epoch [4/50], Loss: 1.7672, Val-loss: 1.8645, Val-acc: 24.4%\n",
      "Epoch [5/50], Loss: 2.0933, Val-loss: 1.8116, Val-acc: 28.5%\n",
      "Epoch [6/50], Loss: 1.8998, Val-loss: 1.7453, Val-acc: 33.5%\n",
      "Epoch [7/50], Loss: 1.7824, Val-loss: 1.6590, Val-acc: 37.2%\n",
      "Epoch [8/50], Loss: 2.0614, Val-loss: 1.7103, Val-acc: 36.6%\n",
      "Epoch [9/50], Loss: 1.2909, Val-loss: 1.4686, Val-acc: 44.6%\n",
      "Epoch [10/50], Loss: 1.5279, Val-loss: 1.3872, Val-acc: 48.1%\n",
      "Epoch [11/50], Loss: 1.1371, Val-loss: 1.3618, Val-acc: 48.8%\n",
      "Epoch [12/50], Loss: 2.1257, Val-loss: 2.0151, Val-acc: 33.9%\n",
      "Epoch [13/50], Loss: 0.8536, Val-loss: 1.3166, Val-acc: 52.7%\n",
      "Epoch [14/50], Loss: 1.0246, Val-loss: 1.3930, Val-acc: 51.2%\n",
      "Epoch [15/50], Loss: 0.6375, Val-loss: 1.0977, Val-acc: 60.8%\n",
      "Epoch [16/50], Loss: 0.7266, Val-loss: 1.0179, Val-acc: 63.0%\n",
      "Epoch [17/50], Loss: 0.5954, Val-loss: 1.0548, Val-acc: 62.6%\n",
      "Epoch [18/50], Loss: 0.9496, Val-loss: 1.1324, Val-acc: 62.2%\n",
      "Epoch [19/50], Loss: 0.5129, Val-loss: 0.8969, Val-acc: 68.0%\n",
      "Epoch [20/50], Loss: 1.0412, Val-loss: 0.9043, Val-acc: 67.5%\n",
      "Epoch [21/50], Loss: 0.5184, Val-loss: 1.0370, Val-acc: 64.2%\n",
      "Epoch [22/50], Loss: 0.4954, Val-loss: 0.8392, Val-acc: 70.6%\n",
      "Epoch [23/50], Loss: 0.4993, Val-loss: 0.8865, Val-acc: 70.3%\n",
      "Epoch [24/50], Loss: 0.6803, Val-loss: 0.8853, Val-acc: 70.2%\n",
      "Epoch [25/50], Loss: 0.7344, Val-loss: 1.0243, Val-acc: 66.9%\n",
      "Epoch [26/50], Loss: 0.4188, Val-loss: 0.8468, Val-acc: 72.1%\n",
      "Epoch [27/50], Loss: 0.2582, Val-loss: 0.7855, Val-acc: 74.5%\n",
      "Epoch [28/50], Loss: 1.0802, Val-loss: 0.7709, Val-acc: 74.6%\n",
      "Epoch [29/50], Loss: 0.8275, Val-loss: 1.3615, Val-acc: 62.9%\n",
      "Epoch [30/50], Loss: 0.5345, Val-loss: 0.7084, Val-acc: 76.4%\n",
      "Epoch [31/50], Loss: 0.6343, Val-loss: 0.9258, Val-acc: 70.9%\n",
      "Epoch [32/50], Loss: 0.2176, Val-loss: 1.0862, Val-acc: 70.6%\n",
      "Epoch [33/50], Loss: 0.2446, Val-loss: 0.7479, Val-acc: 77.3%\n",
      "Epoch [34/50], Loss: 0.3482, Val-loss: 1.2724, Val-acc: 67.9%\n",
      "Epoch [35/50], Loss: 0.2047, Val-loss: 0.7313, Val-acc: 78.9%\n",
      "Epoch [36/50], Loss: 0.2377, Val-loss: 0.8431, Val-acc: 76.8%\n",
      "Epoch [37/50], Loss: 0.2784, Val-loss: 0.9085, Val-acc: 76.1%\n",
      "Epoch [38/50], Loss: 0.3541, Val-loss: 1.9249, Val-acc: 64.2%\n",
      "Epoch [39/50], Loss: 0.1435, Val-loss: 0.7459, Val-acc: 78.9%\n",
      "Epoch [40/50], Loss: 0.2443, Val-loss: 0.9347, Val-acc: 76.2%\n",
      "Epoch [41/50], Loss: 0.1027, Val-loss: 1.0142, Val-acc: 75.8%\n",
      "Epoch [42/50], Loss: 0.2180, Val-loss: 1.0967, Val-acc: 75.2%\n",
      "Epoch [43/50], Loss: 0.0744, Val-loss: 0.9564, Val-acc: 77.9%\n",
      "Epoch [44/50], Loss: 0.1881, Val-loss: 0.9101, Val-acc: 78.4%\n",
      "Epoch [45/50], Loss: 0.1550, Val-loss: 1.0669, Val-acc: 76.3%\n",
      "Epoch [46/50], Loss: 0.0430, Val-loss: 0.9632, Val-acc: 78.9%\n",
      "Epoch [47/50], Loss: 0.0440, Val-loss: 0.9010, Val-acc: 80.1%\n",
      "Epoch [48/50], Loss: 0.0754, Val-loss: 1.2893, Val-acc: 75.9%\n",
      "Epoch [49/50], Loss: 0.0582, Val-loss: 1.0138, Val-acc: 79.1%\n",
      "Epoch [50/50], Loss: 0.0065, Val-loss: 1.0239, Val-acc: 79.4%\n"
     ]
    }
   ],
   "source": [
    "# train and validate the network\n",
    "num_epochs = 50\n",
    "for epoch in range(num_epochs):\n",
    "    model.train()\n",
    "\t# load in the data in batches\n",
    "    for i, (images, labels) in enumerate(dloader_train):  \n",
    "        # move tensors to the configured device\n",
    "        images = images.to(device)\n",
    "        labels = labels.to(device)\n",
    "        \n",
    "        # forward propagation\n",
    "        outputs = model(images)\n",
    "        loss = loss_func(outputs, labels)\n",
    "        \n",
    "        # backward propagation and optimize\n",
    "        optimizer.zero_grad()\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        \n",
    "    # at end of epoch check validation loss and accuracy on validation set\n",
    "    with torch.no_grad():\n",
    "        model.eval()\n",
    "        correct = 0\n",
    "        total = 0\n",
    "        all_val_loss = []\n",
    "        for images, labels in dloader_val:\n",
    "            images = images.to(device)\n",
    "            labels = labels.to(device)\n",
    "            outputs = model(images)\n",
    "            total += labels.size(0)\n",
    "            # calculate predictions\n",
    "            predicted = torch.argmax(outputs, dim=1)\n",
    "            # calculate actual values\n",
    "            correct += (predicted == labels).sum().item()\n",
    "            # calculate the loss\n",
    "            all_val_loss.append(loss_func(outputs, labels).item())\n",
    "        # calculate val-loss\n",
    "        mean_val_loss = sum(all_val_loss) / len(all_val_loss)\n",
    "        # calculate val-accuracy\n",
    "        mean_val_acc = 100 * (correct / total)\n",
    "\n",
    "    print(\n",
    "        'Epoch [{}/{}], Loss: {:.4f}, Val-loss: {:.4f}, Val-acc: {:.1f}%'.format(\n",
    "            epoch+1, num_epochs, loss.item(), mean_val_loss, mean_val_acc\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6c310d89-2083-482b-a9f4-bf59041de8c2",
   "metadata": {},
   "source": [
    "The network is now trained and tested! The network validation accuracy is $79.4\\%$. We can go ahead and save the model to file."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "05989bae",
   "metadata": {},
   "outputs": [],
   "source": [
    "torch.save(model, 'cnn.pt')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fb707d56-7c01-47d1-a06d-cfb2bcac2e4c",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "# Inference\n",
    "\n",
    "Now we will look at how to make predictions with the model. We start by loading the model from file:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "de3b2496",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cuda\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "\n",
    "model = torch.load('cnn.pt')\n",
    "# switch to evaluation mode and device\n",
    "model.eval().to(device)\n",
    "print(device)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "73553acc-9fb3-41e5-ba2a-dd575f58a14e",
   "metadata": {},
   "source": [
    "We will reinitialize the CIFAR-10 test set to similate a typical scenario where we would need to reload everything. Ideally we would not use the validation set as a test set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "7463c3a9-33e5-4917-8f56-dbbbe55ab4af",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Reusing dataset cifar10 (/home/jupyter/.cache/huggingface/datasets/cifar10/plain_text/1.0.0/447d6ec4733dddd1ce3bb577c7166b986eaa4c538dcd9e805ba61f35674a9de4)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Dataset({\n",
       "    features: ['img', 'label'],\n",
       "    num_rows: 10000\n",
       "})"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# import CIFAR-10 dataset from HuggingFace\n",
    "from datasets import load_dataset\n",
    "\n",
    "data_test = load_dataset(\n",
    "    'cifar10',\n",
    "    split='test'  # test set\n",
    ")\n",
    "data_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "b144865d-c66d-4121-8925-a84cdb6574f0",
   "metadata": {},
   "outputs": [],
   "source": [
    "input_tensors = []\n",
    "for image in data_test['img'][:10]:\n",
    "    tensor = preprocess(image)\n",
    "    input_tensors.append(tensor.to(device))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "2d315e65-658b-4fa3-8c96-93eb9a05a8fe",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# we have 10 tensors\n",
    "len(input_tensors)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "d12e0287-5d66-44a4-8a19-144fb5dba9c5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([3, 32, 32])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# all 32x32 dimensional with 3 color channels\n",
    "input_tensors[0].shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "16ed9a7e-85cb-4c8b-9dd3-a878d2478437",
   "metadata": {},
   "source": [
    "We stack these into a single tensor."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "225dfd48-5a59-4b09-9e71-a0b7be377676",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([10, 3, 32, 32])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# stack into a single tensor\n",
    "input_tensors = torch.stack(input_tensors)\n",
    "input_tensors.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "7c1a6d62-96f1-4436-8175-7e98788f8aa8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([5, 8, 1, 0, 6, 6, 1, 6, 3, 1], device='cuda:0')"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# process through model to get output logits\n",
    "outputs = model(input_tensors)\n",
    "# calculate predictions\n",
    "predicted = torch.argmax(outputs, dim=1)\n",
    "predicted"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "476f030e-3da1-40ac-a935-1a2961d8da2a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([10])"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "predicted.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "b15f4b77-8670-4c2d-b8e5-9d19d6b94da5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['airplane',\n",
       " 'automobile',\n",
       " 'bird',\n",
       " 'cat',\n",
       " 'deer',\n",
       " 'dog',\n",
       " 'frog',\n",
       " 'horse',\n",
       " 'ship',\n",
       " 'truck']"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# here are the class names\n",
    "data_test.features['label'].names"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "9be8f514-150f-4700-98e7-7968fc54f6c7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_test[1]['label']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "4b4ebfdc-c24f-4e6f-9437-38a1694d0943",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dog\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ship\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "automobile\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "airplane\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "frog\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "frog\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "automobile\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "frog\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cat\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "automobile\n"
     ]
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "for i, image in enumerate(data_test['img'][:10]):\n",
    "    plt.imshow(image)\n",
    "    plt.show()\n",
    "    print(data_test.features['label'].names[predicted[i]])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a4aca325-39d3-4289-a616-3e09f7704590",
   "metadata": {},
   "source": [
    "Most of these predictions look correct, despite being very low resolution images."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f29b2684-2626-4027-9ecf-28779b17ac67",
   "metadata": {},
   "source": [
    "---"
   ]
  }
 ],
 "metadata": {
  "environment": {
   "kernel": "python3",
   "name": "common-cu110.m95",
   "type": "gcloud",
   "uri": "gcr.io/deeplearning-platform-release/base-cu110:m95"
  },
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.13 (default, Mar 28 2022, 06:59:08) [MSC v.1916 64 bit (AMD64)]"
  },
  "vscode": {
   "interpreter": {
    "hash": "5fe10bf018ef3e697f9035d60bf60847932a12bface18908407fd371fe880db9"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
